home *** CD-ROM | disk | FTP | other *** search
/ HyperLib 1997 Winter - Disc 1 / HYPERLIB-1997-Winter-CD1.ISO.7z / HYPERLIB-1997-Winter-CD1.ISO / オンラインウェア / PRG / Z80ppc 160.sit / Z80ppc 160 / CodesED.c < prev    next >
Text File  |  1995-11-01  |  6KB  |  240 lines

  1. /*    Z80 Emulator: ED instruction handlers
  2.     Copyright (C) 1995 G.Woigk
  3.     
  4.     This file is part of Mac Spectacle and it is free software
  5.     See application.c for details
  6.             
  7.     This program is distributed in the hope that it will be useful,
  8.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  10.  
  11.     based on fMSX; Copyright (C) Marat Fayzullin 1994,1995
  12.     All opcodes covered, no unsupported opcodes!
  13. */
  14.  
  15.  
  16. increment_r;
  17. COUNT_ED_INSTR;
  18.  
  19. switch(n)
  20. {
  21.  
  22.  
  23. case ADC_HL_BC: time(15); M_ADCW(BC); loop;
  24. case ADC_HL_DE: time(15); M_ADCW(DE); loop;
  25. case ADC_HL_HL: time(15); M_ADCW(HL); loop;
  26. case ADC_HL_SP: time(15); M_ADCW(sp); loop;
  27.  
  28. case SBC_HL_BC: time(15); M_SBCW(BC); loop;
  29. case SBC_HL_DE: time(15); M_SBCW(DE); loop;
  30. case SBC_HL_HL: time(15); M_SBCW(HL); loop;
  31. case SBC_HL_SP: time(15); M_SBCW(sp); loop;
  32.  
  33. case LD_xWORDe_BC:    time(20); w = nn; rompoke2(w,BC);    loop;
  34. case LD_xWORDe_DE:    time(20); w = nn; rompoke2(w,DE);    loop;
  35. case LD_xWORDe_HL:    time(20); w = nn; rompoke2(w,HL);    loop;
  36. case LD_xWORDe_SP:    time(20); w = nn; rompoke2(w,sp);    loop;
  37.  
  38. case LD_BC_xWORDe:    time(20); w = nn; RC = peek(w); RB = peek(w+1);    loop;
  39. case LD_DE_xWORDe:    time(20); w = nn; RE = peek(w); RD = peek(w+1);    loop;
  40. case LD_HL_xWORDe:    time(20); w = nn; RL = peek(w); RH = peek(w+1);    loop;
  41. case LD_SP_xWORDe:    time(20); w = nn; sp = peek(w) + ((Short)peek(w+1)<<8);    loop;
  42.  
  43. case IN_B_xC:  time(12); sto_cc; M_IN(RB); loop;
  44. case IN_C_xC:  time(12); sto_cc; M_IN(RC); loop;
  45. case IN_D_xC:  time(12); sto_cc; M_IN(RD); loop;
  46. case IN_E_xC:  time(12); sto_cc; M_IN(RE); loop;
  47. case IN_H_xC:  time(12); sto_cc; M_IN(RH); loop;
  48. case IN_L_xC:  time(12); sto_cc; M_IN(RL); loop;
  49. case IN_A_xC:  time(12); sto_cc; M_IN(ra); loop;
  50. case IN_F_xC:  time(12); sto_cc; M_IN(c);  loop;
  51.  
  52. case OUT_xC_B: time(12); sto_cc; Do_Output(BC,RB); loop;
  53. case OUT_xC_C: time(12); sto_cc; Do_Output(BC,RC); loop;
  54. case OUT_xC_D: time(12); sto_cc; Do_Output(BC,RD); loop;
  55. case OUT_xC_E: time(12); sto_cc; Do_Output(BC,RE); loop;
  56. case OUT_xC_H: time(12); sto_cc; Do_Output(BC,RH); loop;
  57. case OUT_xC_L: time(12); sto_cc; Do_Output(BC,RL); loop;
  58. case OUT_xC_0: time(12); sto_cc; Do_Output(BC,0);     loop_weird2;
  59. case OUT_xC_A: time(12); sto_cc; Do_Output(BC,ra); loop;
  60.  
  61. case ED4E:
  62. case ED66:
  63. case ED6E:    info_misc2;time(8); IM=0; loop_weird2;    // illegal: im0
  64. case ED76:    info_misc2;time(8); IM=1; loop_weird2;    // illegal: im1
  65. case ED7E:    info_misc2;time(8); IM=2; loop_weird2;    // illegal: im2
  66.  
  67. case ED4C:
  68. case ED54:
  69. case ED5C:
  70. case ED64:
  71. case ED6C:
  72. case ED74:
  73. case ED7C:    time(8); c=ra;ra=0;M_SUB(c);    loop_weird2;    // illegal NEG
  74.  
  75. case IM_0:    info_misc2;time(8); IM=0;    loop;
  76. case IM_1:    info_misc2;time(8); IM=1;    loop;
  77. case IM_2:    info_misc2;time(8); IM=2;    loop;
  78.  
  79. case NEG:   time(8); c=ra;ra=0;M_SUB(c);    loop;
  80.  
  81. case LD_I_A:   info_misc2;time(9);RI=ra;loop;
  82. case LD_R_A:   info_misc2;time(9); ld_r_a;    loop;
  83.  
  84. case LD_A_I:
  85.     info_misc2;
  86.     time(9); 
  87.     ra    = RI;
  88.     rf    = (rf&C_FLAG) + (IFF2?P_FLAG:0) + (ra?0:Z_FLAG) + (ra&S_FLAG);
  89.     loop;
  90.  
  91. case LD_A_R:
  92.     info_misc2;
  93.     time(9); 
  94.     ld_a_r;
  95.     rf    = (rf&C_FLAG) + (IFF2?P_FLAG:0) + (ra?0:Z_FLAG) + (ra&S_FLAG);
  96.     loop;
  97.  
  98. case ED5D:    // illegal: reti
  99. case ED6D:
  100. case ED7D:    info_misc2;time(14); pc=pop(); loop_weird2;
  101.  
  102. case ED55:    // illegal: retn
  103. case ED65:
  104. case ED75:    info_misc2;time(14); pc=pop(); IFF1=IFF2; loop_weird2;
  105.  
  106. case RETI:    info_misc2;time(14); pc=pop(); loop;
  107. case RETN:    info_misc2;time(14); pc=pop(); IFF1=IFF2; loop;
  108.  
  109.  
  110. case RRD:
  111.     time(18); 
  112.     c    = (peek(HL)>>4) + (ra<<4);
  113.     ra    = (ra&0xF0) + (peek(HL)&0x0F);
  114.     rf    = (rf&C_FLAG) + zlog_flags[ra];
  115.     rompoke(HL,c);
  116.     loop;
  117.  
  118. case RLD:
  119.     time(18); 
  120.     c     = (peek(HL)<<4) + (ra&0x0F);
  121.     ra    = (ra&0xF0)+(peek(HL)>>4);
  122.     rf    = (rf&C_FLAG) + zlog_flags[ra];
  123.     rompoke(HL,c);
  124.     loop;
  125.  
  126.  
  127. case LDI:
  128.     time(16); 
  129.     rf &= ~(N_FLAG+H_FLAG+P_FLAG);
  130.     if (--BC) rf |= P_FLAG;
  131.     w=DE++; rompoke(w,peek(HL++));
  132.     loop;
  133.  
  134. case LDD:
  135.     time(16); 
  136.     rf &= ~(N_FLAG+H_FLAG+P_FLAG);
  137.     if (--BC) rf |= P_FLAG;
  138.     w=DE--; rompoke(w,peek(HL--));
  139.     loop;
  140.  
  141.  
  142. case LDIR:
  143.     add_r(2*c-2);
  144.     time((Short)(BC-1)*21+16); 
  145.     do {
  146.         if (in_rom(DE)) write_to_rom(DE++,peek(HL++)); else 
  147.         poke ( DE++, peek(HL++) );
  148.     } while(--BC);
  149.     rf &= ~(N_FLAG+H_FLAG+P_FLAG);
  150.     loop;    
  151.  
  152. case LDDR:
  153.     add_r(2*c-2);
  154.     time((Short)(BC-1)*21+16); 
  155.     do { 
  156.         if (in_rom(DE)) write_to_rom(DE--,peek(HL--)); else 
  157.         poke ( DE--, peek(HL--) );
  158.     } while(--BC);
  159.     rf &= ~(N_FLAG+H_FLAG+P_FLAG);
  160.     loop;
  161.  
  162.  
  163. case CPD:    c = peek(HL--); goto c1;
  164. case CPI:    c = peek(HL++);
  165. c1:    time(16); 
  166.     w    = ra-c;
  167.     rf    = (rf&C_FLAG) + (wl&S_FLAG) + (wl?0:Z_FLAG) + N_FLAG + 
  168.           (--BC?P_FLAG:0) + ((ra^c^wl)&H_FLAG);
  169.     loop;
  170.  
  171. case CPIR:
  172.     add_r(2*c-2);
  173.     time((Short)(BC-1)*21+16); 
  174.     do { c=peek(HL++); w=ra-c; --BC; } while(BC&&wl);
  175.     rf    = (rf&C_FLAG) + (wl&S_FLAG) + (wl?0:Z_FLAG) + N_FLAG + 
  176.           (BC?P_FLAG:0) + ((ra^c^wl)&H_FLAG);
  177.     more(-21*BC); 
  178.     add_r(-2*c);
  179.     loop;  
  180.  
  181. case CPDR:
  182.     add_r(2*c-2);
  183.     time((Short)(BC-1)*21+16); 
  184.     do { c=peek(HL--); w=ra-c; --BC; } while(BC&&wl);
  185.     rf    = (rf&C_FLAG) + (wl&S_FLAG) + (wl?0:Z_FLAG) + N_FLAG + 
  186.           (BC?P_FLAG:0) + ((ra^c^wl)&H_FLAG);
  187.     more(-21*BC); 
  188.     add_r(-2*c);
  189.     loop;
  190.  
  191.  
  192. case IND:    w = HL--; goto i1;
  193. case INI:    w = HL++;
  194. i1:    time(16);
  195.     sto_cc; 
  196.     c  = Do_Input(BC);
  197.     rf = N_FLAG + (--RB ? 0:Z_FLAG);
  198.     rompoke(w,c);
  199.     loop;
  200.  
  201. case INDR:    w = -1; goto i2;
  202. case INIR:    w = +1;
  203. i2:    add_r(2*c-2);
  204.     time(-5);
  205.     do {
  206.         more(21);
  207.         sto_cc; 
  208.         c = Do_Input(BC);
  209.         if (in_rom(HL)) write_to_rom(HL,c); else
  210.         poke(HL,c);
  211.         HL += w;
  212.     } while(--RB);
  213.     rf = Z_FLAG + N_FLAG;
  214.     loop;
  215.  
  216.  
  217. case OUTD:    w = HL--; goto o1;
  218. case OUTI:    w = HL++;
  219. o1:    time(16); 
  220.     sto_cc; 
  221.     Do_Output(BC,peek(w));
  222.     rf = N_FLAG + (--RB ? 0:Z_FLAG);
  223.     loop;
  224.  
  225. case OTDR:    w = -1; goto o2;
  226. case OTIR:    w = +1;
  227. o2:    add_r(2*c-2);
  228.     time(-5); 
  229.     do { more(21); sto_cc; Do_Output(BC,peek(HL)); HL+=w; } while(--RB);
  230.     rf = Z_FLAG + N_FLAG;
  231.     loop;
  232.  
  233.  
  234. default:    // ED77, ED7F, ED00-ED3F and ED80-EDFF except block instr
  235.     time(8);
  236.     loop_weird2;
  237. };
  238.  
  239.  
  240.